<?php

require_once 'UE/Log/Interface.php';

/**
 * 以文件方式读写日志
 *
 * ============================================================================
 * 版权所有: (c) 2009-2011，<UEShop Inc>，并保留所有权利。
 * 网站地址: http://www.ueshop.cn
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 *
 * @author      cmpan
 * @copyright   Copyright (c) 2009-2011 UEShop Inc. (http://www.ueshop.cn)
 * @license     http://www.ueshop.cn/1_0.txt
 */
class UE_Log_File implements UE_Log_Interface {
	protected $_logDir = 'data/logs';
	protected $_logSize = 2048000;  // 每个日志文件的大小
	private static $_renamed = 0;  // 当前进程是否已经有分文件保存日志的操作

	/**
	 * 写日志
	 * <pre>
	 * 如果日志文件大于当前设置($this->_logSize)日志大小，则把日志文件重命名存档，再创建新的日志文件
	 * </pre>
	 *
	 * @param string $id  存贮容器(文件)
	 * @param mixed $log  日志内容
	 */
	public function write($id, $log) {
		$id = urlencode($id);
		global $config;
		$time = time();
		$yearMonth = date('Y-m', $time);
		$logFile = $this->_logDir . "/{$id}.php";

		// 日志文件分文件保存
		if(@is_file($logFile) && filesize($logFile) > $this->_logSize) {
			$archiveTime = date('Y-m-d_H-i-s', $time);
			$logFileBak = $this->_logDir . "/{$id}_{$archiveTime}.archive.php";
			if (!self::$_renamed) {				
				@rename($logFile, $logFileBak);
				self::$_renamed++;
			}
		}

		// 文件不存在
		if(!is_file($logFile)) {
			if(!$fp = @fopen($logFile, 'w')){
				throw new UE_Log_Exception('不能打开日志文件' . $logFile);
			}
			@flock($fp, LOCK_EX);
			$log = is_array($log) ? $log : array($log);
			foreach($log as $tmp) {
				fwrite($fp, "<?php\r\nif(!defined('UE_IN')) exit('Access Denied');\r\n");
			}
			@flock($fp, LOCK_UN);
			fclose($fp);
		}

		// 写日志
		if(!$fp = @fopen($logFile, 'a')) {
			throw new UE_Log_Exception('不能打开日志文件' . $logFile);
		}
		@flock($fp, LOCK_EX);

		$log = is_array($log) ? $log : array($log);
		foreach($log as $tmp) {
			$tmp = str_replace("'", "\'", htmlspecialchars($tmp));
			@fwrite($fp, "\$logArchive['{$id}'][] = '" . date('Y-m-d H:i:s') . "\t{$tmp}';\r\n");
		}

		@flock($fp, LOCK_UN);
		fclose($fp);
	}

	/**
	 * 读取日志
	 *
	 * @param string $id  日志id
	 * @param int $page  读出第几页
	 * @return array  array(日志页数, array(该页第几条日志 => 日志内容))
	 */
	public function read($id, $page = 1) {
		$d = dir($this->_logDir);
		$f = array();
		while (false !== ($entry = $d->read())) {
		    $entry = trim($entry, '.');
		    if ($entry && trim($id) == substr($entry, 0, strlen($id))) {
		    	$f[] = $entry;
		    }
		}
		$d->close();
		
		$totalPage = count($f);		
		$page = ($page > $totalPage) ? $totalPage : $page;
		
		$logFile = $this->_logDir . '/' . $f[$page-1];
		require_once $logFile;
		return array($totalPage, $logArchive[$id]);
	}
	
	public function search($id, $keywork) {
		if (empty($id) || empty($keywork)) {
			return array();
		}
		$result = array();
		$d = dir($this->_logDir);
		
		while (false !== ($entry = $d->read())) {
		    $entry = trim($entry, '.');
		    if ($entry && trim($id) == substr($entry, 0, strlen($id))) {
		    	require_once $this->_logDir . '/' . $entry;
		    	foreach ($logArchive[$id] as $v) {
		    		if(strstr($v, $keywork)) {
		    			$result[] = str_replace($keywork, "<span class=\"mark\">$keywork</span>", $v);
		    		}
		    	}
		    	unset($logArchive);
		    }
		}
		$d->close();
		return $result;
	}
}

